#pragma once
#include "D3D12/D3D12Core.h"
#include "D3D12/D3D12Device.h"
#include "D3D12/D3D12LinkedDevice.h"
#include "D3D12/D3D12Profiler.h"
#include "D3D12/D3D12CommandQueue.h"
#include "D3D12/D3D12CommandList.h"
#include "D3D12/D3D12CommandContext.h"
#include "D3D12/D3D12DescriptorHeap.h"
#include "D3D12/D3D12RootSignature.h"
#include "D3D12/D3D12PipelineState.h"
#include "D3D12/D3D12Resource.h"
#include "D3D12/D3D12Descriptor.h"
#include "D3D12/D3D12SwapChain.h"
#include "D3D12/D3D12Fence.h"
#include "D3D12/D3D12Raytracing.h"
#include "D3D12/D3D12CommandSignature.h"

#include "ShaderCompiler.h"

#include <glfw/glfw3.h>
#define GLFW_EXPOSE_NATIVE_WIN32
#include <glfw/glfw3native.h>

namespace RHI
{
    class WindowSystem;

    struct RHIInitInfo
    {
        std::shared_ptr<WindowSystem> window_system;
    };

    class RHI
    {
    public:
        virtual ~RHI() = 0;

        virtual void initialize(RHIInitInfo initialize_info) = 0;
        virtual void prepareContext() = 0;
        bool         isValidationLayerEnabled() const { return m_enable_validation_Layers; }
        bool         isDebugLabelEnabled() const { return m_enable_debug_utils_label; }
        bool         isPointLightShadowEnabled() const { return m_enable_point_light_shadow; }

    protected:
        bool m_enable_validation_Layers{ true };
        bool m_enable_debug_utils_label{ true };
        bool m_enable_point_light_shadow{ true };

        // used in descriptor pool creation
        uint32_t _max_vertex_blending_mesh_count{ 256 };
        uint32_t _max_material_count{ 256 };

    private:
    };

    inline RHI::~RHI() = default;
} // namespace RHI
